package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/contract")
public class ContractController extends BaseController {

    @Reference(check = false, retries = 0)
    private ContractService contractService;
    @Autowired
    private DeptService deptService;


    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {
        //创建查询添加
        ContractExample contractExample = new ContractExample();
        //如果需要排序，排序不是查询，所以排序的代码不是在Criteria对象，在ContractExample
        contractExample.setOrderByClause("create_time desc");
        //创建条件对象
        ContractExample.Criteria criteria = contractExample.createCriteria();
        //获取当前登陆者
        User loginUser = getLoginUser();
        //获取登陆者等级
        Integer degree = loginUser.getDegree();
        //判断用户的等级
        if (degree == 4) {
            //普通员工
            criteria.andCreateByEqualTo(loginUser.getId());

        } else if (degree == 3) {
            //部门经理
            criteria.andCreateDeptEqualTo(loginUser.getDeptId());

        } else if (degree == 2) {
            //大区经理
            PageInfo<Contract> pageInfo = contractService.findPageByDeptId(loginUser.getDeptId(), pageNum, pageSize);
            request.setAttribute("pageInfo", pageInfo);
            return "cargo/contract/contract-list";

        } else if (degree == 1) {
            //企业管理员
            criteria.andCompanyIdEqualTo(loginUser.getCompanyId());
        }
        PageInfo<Contract> pageInfo = contractService.findByPage(contractExample, pageNum, pageSize);
        //存储到请求域中
        request.setAttribute("pageInfo",pageInfo);
        return "cargo/contract/contract-list";
    }

    /*
    作用：进入购销合同的添加,和把登录者的 上级部门 的人找出来
    路径： /cargo/contract/toAdd.do
    参数： 没有
    返回值： cargo/contract/contract-add
 */
    @RequestMapping("/toAdd")
    public String toAdd() {
       /* //查找登录者用户所在的部门，间接拿到父部门的id
        Dept dept = deptService.findById(getLoginUser().getDeptId());
        //通过部门id找出用户(如果这里的父部门id为空，要加强修改)
        List<User> checkByList = null;
        if (dept.getParent() == null) {
            checkByList = userService.findUserByDeptId(dept.getParent().getId());
            System.out.println("------------------");
            System.out.println(checkByList);
        }else{
            //这里后续修改
            checkByList.add(getLoginUser());
        }
        request.setAttribute("checkByList", checkByList);*/
        return "cargo/contract/contract-add";
    }


    /*
    作用： 保存添加与修改购销合同
    路径： /cargo/contract/edit.do
    参数： 购销合同
    返回值：购销合同列表
 */
    @RequestMapping("/edit")
    public String edit(Contract contract){
        //1. 给购销合同补充企业的id与企业名称
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();
        contract.setCompanyId(companyId);
        contract.setCompanyName(companyName);
        //购销合同的创建人
        contract.setCreateBy(getLoginUser().getId());
        //购销合同创建人所属部门
        contract.setCreateDept(getLoginUser().getDeptId());

        //2.根据购销合同的id判断是否是增加还是修改
        if(StringUtils.isEmpty(contract.getId())){
            //添加
            contractService.save(contract);
        }else{
            //修改
            contractService.update(contract);
        }
        //3. 返回购销合同的列表页面
        return "redirect:/cargo/contract/list.do";
    }


    /*
       作用：进入修改页面
       路径： /cargo/contract/toUpdate.do?id=5af45318-6585-4e8b-85c6-75c1f3bf2c9f
       参数： 购销合同的id
       返回值：cargo/contract/contract-update
    */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //1. 根据id查询当前购销合同
        Contract contract = contractService.findById(id);
        request.setAttribute("contract",contract);
        //2. 返回更新页面
        return "cargo/contract/contract-update";
    }

    /*
         作用：删除购销合同
         路径： /cargo/contract/delete.do
         参数： 购销合同的id
         返回值：购销合同列表
     */
    @RequestMapping("/delete")
    public String delete(String id){
        //1. 删除购销合同
         contractService.delete(id);
        return "redirect:/cargo/contract/list.do";
    }


    /*
      作用： 查看购销合同
      路径： /cargo/contract/toView.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      参数： 购销合同id
      返回值：cargo/contract/contract-view
    */
    @RequestMapping("/toView")
    public String toView(String id){
        //根据id查找购销合同
        Contract contract = contractService.findById(id);
        //存储到请求域中
        request.setAttribute("contract",contract);
        return "cargo/contract/contract-view";
    }


    /*
      作用： 提交购销合同
      路径： /cargo/contract/submit.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      参数： 购销合同id
      返回值：购销合同列表
    */
    @RequestMapping("/submit")
    public String submit(String id){
        //根据id查找购销合同
        Contract contract = contractService.findById(id);
        //如果是自己创建,自己审核就会失败
      /*  if (getLoginUser().getUserName().equals(contract.getCreateBy())) {
            return "redirect:/cargo/contract/list.do";
        }
        //如果审核人不是自己，会审核失败
        if (!getLoginUser().getUserName().equals(contract.getCheckBy())) {
            return "redirect:/cargo/contract/list.do";
        }*/
        //修改购销合同状态
        contract.setState(1);
        //更新购销合同
        contractService.update(contract);
        return "redirect:/cargo/contract/list.do";
    }


    /*
      作用： 取消购销合同
      路径： /cargo/contract/cancel.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      参数： 购销合同id
      返回值：购销合同列表
    */
    @RequestMapping("/cancel")
    public String cancel(String id){
        //根据id查找购销合同
        Contract contract = contractService.findById(id);
        //修改购销合同状态
        contract.setState(0);
        //更新购销合同
        contractService.update(contract);
        return "redirect:/cargo/contract/list.do";
    }
    @RequestMapping("/getCheckBy")
    @ResponseBody
    public List<User> getCheckBy(){
        User user = getLoginUser();
        List<User> userList = contractService.findByRoleName("审单人");
        return userList;
    }
}
